package cn.edu.wynu.oop.classdef;

/**
 * 通过 class 类名 {} 定义一个类
 * 类名建议使用大驼峰命名法，所有单词的首字母大写
 * 类的定义：
 *   对现实世界的某个事物的抽象描述，是一种模板，用于创建对象；
 *   比如：人、车、狗、猫等
 */
public class Person {
    // 类的成员（类的构成）： 属性/方法/构造器

    // 1.属性（成员变量）： 描述类的特征，比如：姓名、年龄、性别等
    // 属性定义： [访问修饰符] 数据类型 属性名;
    String name; // 姓名属性
    int age; // 年龄属性
    float height; // 身高属性

    // 2.方法（成员方法）： 描述类的行为，比如：说话、跑步等; 方法定义： [访问修饰符] 返回值类型 方法名([参数列表]) { 方法体 }
    // 吃饭方法
    void eat() {
        System.out.println(name + "正在吃饭");
    }

    // 睡觉方法
    void sleep() {
        System.out.println(name + "正在睡觉");
    }

    // 自我介绍
    void introduce() {
        System.out.println("我是" + name + "，我今年" + age + "岁，我身高" + height + "米");
    }

    @Override
    public boolean equals(Object obj) {
        return this.name.equals(((Person) obj).name) &&
                this.age == ((Person) obj).age &&
                this.height == ((Person) obj).height;
    }

    // 构造器 construct
    // 1.构造器的作用： 用于创建对象，初始化对象的属性
    // 2.构造器的定义： [访问修饰符] 类名([参数列表]) { 构造器体 }
    Person() {
        System.out.println("无参数的构造器");
    }
    // 有参数的构造器
    public Person(String name, int age, float height) {
        System.out.println("有参数的构造器");
        this.name = name;
        this.age = age;
        this.height = height;
    }


    // 3.特点:①构造器的名称与类名相同，没有返回值类型，也不能写void
    // ②构造器可以有参数，也可以没有参数
    // ③如果没有定义构造器，系统会默认提供一个无参数的构造器
    // ④如果定义了构造器，系统就不会再提供默认的无参数构造器

    public static void main(String[] args) {
        // 类是模板，对象是实例；可以通过模板生成出对应的产品
        Person zhangSan = new Person();
        zhangSan.name = "张三";
        zhangSan.age = 18;
        zhangSan.height = 1.8f;
        System.out.println("张三的信息如下：");
        System.out.println("姓名：" + zhangSan.name);
        System.out.println("年龄：" + zhangSan.age);
        System.out.println("身高：" + zhangSan.height);
        zhangSan.eat();
        zhangSan.sleep();
        zhangSan.introduce();

        Person liSi = new Person("李四", 20, 1.75f);

        liSi.introduce();
    }
}
